package com.briup.cms.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.briup.cms.bean.Category;
import com.briup.cms.bean.Slideshow;
import com.briup.cms.bean.extend.CategoryExtend;
import com.briup.cms.exception.ServiceException;
import com.briup.cms.service.CategoryService;
import com.briup.cms.mapper.CategoryMapper;
import com.briup.cms.util.ResultCode;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.List;
import java.util.Objects;

/**
* @author wo'q'q'c
* @description 针对表【cms_category】的数据库操作Service实现
* @createDate 2024-11-18 15:52:41
*/
@Service
@Slf4j
public class CategoryServiceImpl implements CategoryService{
    @Autowired
    private CategoryMapper categoryMapper;

    @Override
    public void save(Category category) {
        if(category == null){
            throw new ServiceException(ResultCode.PARAM_IS_BLANK);
        }
        if(!StringUtils.hasText(category.getName())){
            log.error("新增栏目时，传入的栏目名称为null");
            throw new ServiceException(ResultCode.DATA_IS_EMPTY);
        }
        //判断栏目名是否唯一
        LambdaQueryWrapper<Category> qw = new LambdaQueryWrapper<>();
        qw.eq(Category::getName,category.getName());
        if(categoryMapper.selectOne(qw) != null){
            throw new ServiceException(ResultCode.CATEGORY_HAS_EXISTED);
        }
        //如果有父栏目 判断 父栏目是否存在 且有效( 有效性前端已验证)
        Integer parentId = category.getParentId();
        if(parentId != null && categoryMapper.selectById(parentId) == null){
            throw new ServiceException(ResultCode.PARAM_IS_INVALID);
        }
        //设置栏目序号  获取表中序号的最大值 + 1 赋值给 category
        //设置不超过10

        if(categoryMapper.selectCount(null) != 0){
            Integer mo = categoryMapper.getMaxOrderNum();
            if(mo == null){
                category.setOrderNum(1);
            }else if(mo == 10){
                category.setOrderNum(10);
            }else if(mo < 10){
                category.setOrderNum(mo + 1);
            }
            log.info("max_order_num:" + mo);
        }
        categoryMapper.insert(category);
    }

    @Override
    public Category getById(Long id) {
        return categoryMapper.selectById(id);
    }

    @Override
    public void update(Category category) {
        // 栏目名 可以修改 但必须唯一
        String categoryName = category.getName();
        Integer categoryId = category.getId();
//        LambdaQueryWrapper<Category> qw = new LambdaQueryWrapper<>();
//        qw.eq(Category::getName,category.getName());
//        if(categoryMapper.selectOne(qw) != null){
//            throw new ServiceException(ResultCode.CATEGORY_HAS_EXISTED);
//        }

        // 根据id查询category的对象
        Category oldCategory = categoryMapper.selectById(category.getId());

        if(StringUtils.hasText(categoryName)) {
            // 验证和之前的一样不一样
            if(categoryName.equals(oldCategory.getName())){
                log.error("不能修改和之前一样的类别名字");
                throw new ServiceException(ResultCode.FAIL);
            }else {
                // 判读栏目名称是否重复
                if(!checkCategoryName(categoryName)){
                    log.error("新增栏目时，栏目名称重复");
                    throw new ServiceException(ResultCode.DATA_NOT_UNIQUE);
                }
            }
        }
        // 栏目级别不可以修改 => parentId不能由有数据置为null，不能由null变为具体数字

        // 可以更改二级栏目的所属一级栏目
        // 检查原来的parentId是多少
        Integer oldParentId = oldCategory.getParentId();
        // 比对传入的和原来的是否一致，要求传入的和原来的parentId都得有值
        if(oldParentId == null || oldParentId.equals(category.getParentId())){
            category.setParentId(null);
        }
        categoryMapper.updateById(category);

        //栏目级别不能改动  parentId 不能由有值 变为 null ,不能由 null 变为 具体数据

        //如果更改二级栏目的父目录，新传入的parent_id必须为有效1级栏目id

        //要求传入的parentId 和 原来的parentId 都得有值

    }

    @Override
    public IPage<Category> query(Integer pageNum, Integer pageSize, Integer parentId) {
        IPage<Category> page = new Page<>(pageNum,pageSize);
        LambdaQueryWrapper<Category> qw = new LambdaQueryWrapper<>();
        qw.eq(parentId != null,Category::getParentId,parentId);
        qw.orderByAsc(Category::getParentId).orderByAsc(Category::getOrderNum);
        categoryMapper.selectPage(page,qw);
        if(page.getTotal() == 0) throw new ServiceException(ResultCode.CATEGORY_NOT_EXIST);
        return page;
    }

    @Override
    public List<CategoryExtend> selectAllParent() {
       return categoryMapper.selectAllWithCates();
    }


    // -------  私有工具 ---
    /**
     * 验证categoryName是否重复
     * @param categoryName 栏目名称
     * @return 是否重复 boolean
     */
    private boolean checkCategoryName(String categoryName){
        // 判读栏目名称是否重复
        LambdaQueryWrapper<Category> lqw = new LambdaQueryWrapper<>();
        lqw.eq(Category::getName,categoryName);
        // c代表根据加入的名字查出来的栏目对象
        Category c = categoryMapper.selectOne(lqw);
        // 如果c不为空，则证明名称不唯一
        if(Objects.nonNull(c)){
            return false;
        }else {
            return true;
        }
    }

}




